VSCodeのPython拡張機能でテストカバレッジ表示機能が追加されました

VSCodeのPython拡張機能でテストカバレッジ表示機能が追加されました

VSCodeのPython拡張機能でテストカバレッジ表示機能が追加されたので、検証してみました
Clock Icon2024.10.15

はじめに

こんにちは、アノテーションのなかたです。
https://devblogs.microsoft.com/python/python-in-visual-studio-code-october-2024-release/
今回は、VSCodeのPython拡張機能でテストカバレッジ表示機能が追加されたので、検証してみました。
以前までは、Coverage Gutters 等の拡張機能を追加でインストールする必要がありましたが、Python拡張機能が対応したことで導入がしやすくなったと思います。

やってみる

今回は、Pytest と pytest-cov によるテスト環境でカバレッジ表示機能を試しています。

また手順 1, 2, 3 については、VSCode で Pytest によるテストカバレッジ環境を用意する手順になりますので、用意できている方は手順4から読み進めていただければと思います。

1. テスト環境の準備

Python拡張機能をインストールします。

https://marketplace.visualstudio.com/items?itemName=ms-python.python
また、Pythonやライブラリをインストールします。

Python仮想環境の作成やPytestのインストール

コマンドで実行する例を以下に挙げていきます。

bash
# フォルダの作成
mkdir app
cd app

# Python仮想環境の作成と起動
python3 -m venv .venv
source .venv/bin/activate

# Pytestのインストール
pip install pytest

# フォルダの作成
mkdir src
mkdir tests

# ImportErrorを避けるため、__init__.pyの作成
touch tests/__init__.py

テスト対象のスクリプトを作成します。

src/main.py
def add(x: int, y: int) -> int:
    return x + y

five = add(2, 3)
print(f'{five = }')

テストコードを書きます。

tests/test_main.py
from src.main import add

def test_add():
    assert add(1, 2) == 3
    assert add(2, 4) == 6
    assert add(3, 5) == 8

念のため、pytestコマンドからテストが実行できることを確認します。

bash
(.venv) vscode_python_coverage % pytest tests/test_main.py
================================================================== test session starts ===================================================================
platform darwin -- Python 3.12.6, pytest-8.3.3, pluggy-1.5.0
rootdir: /Users/xxxx/Documents/Dev/vscode_python_coverage
collected 1 item

tests/test_main.py .                                                                                                                               [100%]

=================================================================== 1 passed in 0.01s ====================================================================

実行が確認できました。

以下のようなディレクトリ構造でテストを想定しています。

% tree
.
├── src
│   └── main.py
└── tests
    ├── __init__.py
    └── test_main.py

3 directories, 3 files

2. テストエクスプローラーの準備

テストエクスプローラーを準備していきます。

まず、Configure Python Testsからテストに使うツールを選択します。
今回はPytestを使うので、そちらを選択します。
スクリーンショット 2024-10-08 16.06.35.png
次に、テストコードを配置するフォルダを指定します。
testsフォルダを作成しておいたため、そちらを選択します。
スクリーンショット 2024-10-08 16.07.50.png
すると、このようにそれぞれのテストを実行できるUIが用意されます。
ファイルの横に表示されている>ボタンからテストの実行が可能です。
image.png

3. テストカバレッジ機能の有効化

カバレッジ結果を集計するため、pytest-covライブラリをインストールします。

bash
pip install pytest-cov

またsettings.jsonにて、Pytest実行時にカバレッジファイルが作成されるよう以下のJSONを入力します。

settings.json
{
    // Pytestの有効化
    "python.testing.unittestEnabled": false,
    "python.testing.pytestEnabled": true,

    // Pytest実行時のオプション
    "python.testing.pytestArgs": [
        "tests", "--cov=src", "--cov-report", "xml"
    ]
}

4. カバレッジ表示機能の有効化

設定に以下の項目を追加し、テストカバレッジ表示機能を有効化します。

settings.json
"python.experiments.optInto": ["pythonTestAdapter"]

設定を読み込んだ状態でPython拡張機能を起動させたいので、ウィンドウのリロードを行います。
コマンドパレット(Command + Shift + p)からDeveloper: Reload Windowを選択することでリロードができます。
スクリーンショット 2024-10-15 18.18.40
リロードした後にテストエクスプローラーを表示すると、テスト項目の右側にてチェックマークのようなマークが付属したテスト実行ボタンが表示されると思います。
スクリーンショット 2024-10-15 18.11.00
こちらが表示されたことでカバレッジ表示機能の有効化が確認できました。

5. カバレッジ表示機能を試してみる

まず、カバレッジが表示されていない画面を見てみます。

特にテストに関連する表示は見当たりません。
スクリーンショット 2024-10-15 18.26.06
先ほども言及したチェックマークのついたボタンから、テストを実行します。
スクリーンショット 2024-10-15 18.26.32
コードブロックごとにテストがカバーされている部分とされていない部分が色分けされました。
テストでカバーしていない例外ブロックをパッと把握できるようになりました。
スクリーンショット 2024-10-15 18.26.45
ディレクトリツリーでもカバレッジ結果が表示されていました。
スクリーンショット 2024-10-15 18.27.21

おわりに

今回の検証において、設定項目の追加し忘れや拡張機能がリロードされていないことによりハマった部分が多かったです。
有効化する際には、手順を着実に確認しながら進めるのが良いと感じました。

参考

https://qiita.com/moshi/items/24dcc24d6f429503f533
https://news.mynavi.jp/techplus/article/20241007-3040325/
https://qiita.com/moshi/items/21a6ff0a20cd840f71ea

アノテーション株式会社について

アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.